package tpo.modelo;

import java.util.Date;

import org.joda.time.DateMidnight;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Reserva {
	private static int proximoNumero = 1;
	private int numero;
	private Date fechaInicio;
	private Date fechaFin;
	private Automovil automovil;
	private String estado;
	private Cliente cliente;
	
	public Reserva(Date fechaInicio, Date fechaFin, Automovil automovil, Cliente cliente) {
		this.numero = getProximoNumero();
		this.fechaInicio = fechaInicio;
		this.fechaFin = fechaFin;
		this.automovil = automovil;
		this.estado = "NO_CONFIRMADA";
		this.cliente = cliente;
	}

	private int getProximoNumero() {
		return proximoNumero++;
	}
	
	public boolean sosReserva(int numero) {
		return this.numero == numero;
	}
	
	public void cancelar() {
		this.estado = "CANDELADA";
	}
	
	public Date getFechaInicio() {
		return fechaInicio;
	}
	
	public Date getFechaFin() {
		return fechaFin;
	}
	
	public Cliente getCliente() {
		return cliente;
	}
	
	public Automovil getAutomovil() {
		return automovil;
	}
	
	public void confirmar() {
		this.estado = "CONFIRMADA";
	}
	
	public boolean vigente() {
		DateTime fechaInicioDT = new DateTime(fechaInicio);
		DateTime fechaLimite = fechaInicioDT.plus(Period.days(1));
		int anticipo = Days.daysBetween(new DateMidnight(new Date()), new DateMidnight(fechaLimite)).getDays();
		if(anticipo < 0) {
			return false;
		} else {
			return true;
		}
	}
	
	public void cancelarPorNoConfirmacion() {
		this.estado = "CANCELADA_POR_NO_CONF";
	}
	
	public boolean suficienteAnticipacionParaCancelar() {
		DateTime fechaInicioDT = new DateTime(fechaInicio);
		DateTime fechaLimite = fechaInicioDT.minus(Period.days(2));
		int anticipo = Days.daysBetween(new DateMidnight(new Date()), new DateMidnight(fechaLimite)).getDays();
		if(anticipo < 0) {
			return false;
		} else {
			return true;
		}
	}
	
	public boolean tenesCliente(Cliente c) {
		return (cliente != null && cliente.equals(c));
	}
	
	public int getNumero() {
		return numero;
	}
}
